#ifndef NP_CONFIG_XMLCONFBASE_H
#define NP_CONFIG_XMLCONFBASE_H

#include <stdlib.h>
#include <string>
#include <string.h>
#include <pugixml/include/pugixml.hpp>
#include <exception/NpException.h>

extern const int g_fileNameLength;
extern const char g_confDirEnv[];

class XmlConfBase
{
protected:
  XmlConfBase();
  XmlConfBase(const std::string& fileName);
  virtual ~XmlConfBase();

public:
  /**
    * 从xml配置文件读取配置信息
    */
  virtual void initializeConfigs();
  virtual void initializeConfigs(std::string& path);

protected:
  /**
    * 读取 NP＿CONFIG 环境变量与文件名组合成一个完整的配置文件路径
    * @param fileName 文件名
    * @param conf 输出参数，完整的配置文件路径
    */
  inline void combine(const std::string& fileName, std::string& conf);

  /**
    * 从 xml 中取一个 node
    * @param path xpath，如 /configs/config
    * @param pugixml 已加载 xml 的实例
    */
  const pugi::xpath_node* getFirstNode(const std::string& path, const pugi::xml_document& pugixml);

  /**
    * 修改要读的配置文件
    * @param fileName 新配置文件名
    */
  void setFileName(const std::string& fileName) { m_fileName = fileName; }

private:
  /**
    * 供子类继承以筛选配置信息
    */
  virtual void todo(const pugi::xml_document& pugixml ) = 0;
  void isNull();

protected:
  //  pugi::xml_document m_pugixml;
//    std::string m_filePath;
    std::string m_fileName; /**< 配置文件名字*/

};

inline void XmlConfBase::combine(const std::string& fileName, std::string &conf)
{
  conf = "";
  char* tmp = getenv(g_confDirEnv);
  npexception::throwExIf(tmp == NULL, npexception::GET_CONF_PATH_ENV_ERROR);
  conf += tmp;
  conf += (tmp[strlen(tmp) - 1] == '/') ? fileName : (std::string("/") + fileName);
//  m_filePath = conf;
}

#endif // NP_CONFIG_XMLCONFBASE_H
